<?php

namespace app\admin\model;

use think\facade\Db;


/**
 * 成果管理模型
 * 
 * 时间 ： 2020年3月13日13:27:05
 * 作者 ： 夏立军
 */
class AchievementManage
{

    // 成果分类 ========================================================================

    /**
     * 获取所有分类数据
     * 
     * @return 分类的所有数据
     */
    public function classify_all_data()
    {
        $am_list = Db::name('classify')->where('issue',1)->where('flag',2)->select();
        return $am_list;
    }

    /**
     * 获取所有的分类
     * @return 分类的总数量
     */
    public function classify_all_count(): ?int
    {
        $am_list = Db::name('classify')->count();
        return $am_list;
    }

    /**
     * 成果分类列表 分页显示
     * 
     * @param $offset 获取数据的开始位置
     * @param $size   获取数据的条数
     * @return 获取到的所有项目
     */
    public function classify_list(int $offset, int $size = 10)
    {
        $am_list = Db::name('classify')->alias('a')
            ->join(['ams_admin' => 'b'], 'a.aid=b.id')
            ->field('a.*,b.name as admin_name')
            ->limit($offset, $size)->select();
        return $am_list;
    }

    /**
     * 启用禁用分类
     * @param $id 准备启用或禁用的ID
     * @param $issue 准备修改的状态
     * @return 修改是否成功的状态
     */
    public function classify_issue(int $id, int $issue)
    {
        $am_issue = Db::name('classify')->where('id', $id)->save(['issue' => $issue]);
        return $am_issue;
    }

    /**
     * 删除某一个分类
     * @param $id 准备启用或禁用的ID
     * @return 删除是否成功的状态
     */
    public function classify_del(int $id)
    {
        try {
            $am_del = Db::name('classify')->where('id', $id)->delete();
        } catch (\Exception  $e) {
            $am_del = false;
        }
        return $am_del;
    }

    /**
     * 添加某一个分类
     * @param $aid 创建者ID
     * @param $name 分类名称
     * @param $note 分类描述
     * @param $issue=0 分类默认不发布
     * @return 添加是否完成
     */
    public function classify_add(int $aid, string $name, string $note, int $issue = 0)
    {
        $data['aid'] = $aid;
        $data['name'] = $name;
        $data['note'] = $note;
        $data['issue'] = $issue;
        $data['create_time'] = time();

        // 表结构原因 如果 添加的名称重复则不能添加
        try {
            $am_add = Db::name('classify')->save($data);
        } catch (\Exception  $e) {
            $am_add = false;
        }
        return $am_add;
    }

    /**
     * 获取某一个分类的所有信息
     * 
     * @param $id 分类ID
     * @return 该分类的所有信息
     */
    public function classify_get_info(int $id)
    {
        $am_info = Db::name('classify')->where('id', $id)->find();
        return $am_info;
    }

    /**
     * 修改分类的状态
     * 
     * @param $id 分类ID
     * @param $flag 分类要修改的状态
     * @return 是否修改
     */
    public function classify_set_flag(int $id, int $flag)
    {
        $am_info = Db::name('classify')->where('id', $id);
        if (!$am_info->find())
            return false;
        $data['flag'] = $flag;
        return $am_info->save($data);
    }

    // 成果分类中间表操作 ========================================================================

    /**
     * 添加一张分类的内容描述信息
     * 
     * @param $cid 分类ID
     * @param $table_name 需要创建的表名
     * @param $table_content 表内列的内容
     * @return 是否添加成功
     */
    public function classify_table_add(int $cid, string $table_name, string $table_content)
    {
        $data['cid'] = $cid;
        $data['table_name'] = $table_name;
        $data['table_content'] = $table_content;
        $data['create_time'] = time();

        try {
            $am_add = Db::name('classify_table')->save($data);
        } catch (\Exception  $e) {
            $am_add = Db::name('classify_table')->where('cid', $cid)->save($data);
        }
        return $am_add;
    }

    /**
     * 获取一张分类的内容描述信息
     * 
     * @param $cid 分类ID
     * @return 获取到的内容
     */
    public function classify_table_info_by_cid(int $cid)
    {
        $am_info = Db::name('classify_table')->where('cid', $cid)->find();
        return $am_info;
    }

    /**
     * 清空某一个分类中间表的数据
     * @param $id 准备启用或禁用的ID
     * @return 清空是否成功的状态
     */
    public function classify_clear(int $cid)
    {
        try {
            $am_del = Db::name('classify_table')->where('cid', $cid)->delete();
        } catch (\Exception  $e) {
            $am_del = false;
        }
        return $am_del;
    }

    /**
     * 通过中间表的内容，创建一张对应的数据表
     * @param $cid 分类ID
     * @param $table_name 数据表名称
     * @return 是否创建成功
     */
    public function classify_table_create(int $cid, string $table_name)
    {
        $am_info = Db::name('classify_table')->where('cid', $cid)->find();

        // 多重判断，以防万一
        if ($am_info['table_name'] != $table_name) {
            return false;
        }

        // 需要创建的字段
        $table_content = json_decode($am_info['table_content'], true);
        $table_content_len = count($table_content['cols']);

        $create_table_sql = "CREATE TABLE `";
        $create_table_sql .= $am_info['table_name'];
        $create_table_sql .= "` (";
        $create_table_sql .= "`id` int(10) NOT NULL AUTO_INCREMENT COMMENT '成果ID',";
        $create_table_sql .= "`pid` int(10) NOT NULL COMMENT '父级表ID',";
        $create_table_sql .= "`uid` int(10) NOT NULL COMMENT '用户ID',";


        for ($i = 0; $i < $table_content_len; $i++) {
            foreach (config('ams_config.classify_type_list') as $row) {
                if ($row['value'] == $table_content['selects'][$i]) {
                    $table_content['selects'][$i] = $row['type'];

                    if ($table_content['lens'][$i] == '') {
                        $table_content['lens'][$i] = $row['max_len'];
                    } else {
                        $table_content['lens'][$i] = ($table_content['lens'][$i] < $row['max_len']) ? $table_content['lens'][$i] : $row['max_len'];
                    }
                    break;
                }
            }

            $create_table_sql .= sprintf(
                "`%s` %s(%d) NOT NULL COMMENT '%s',",
                $table_content['cols'][$i],
                $table_content['selects'][$i],
                $table_content['lens'][$i],
                $table_content['notes'][$i]
            );
        }

        $create_table_sql .= "`status` tinyint(3) NOT NULL DEFAULT 0 COMMENT '成果状态 编辑完成 审核 已审核 审核通过 驳回 已完成',";
        $create_table_sql .= "`audit_id` int(10) COMMENT '审核员ID',";
        $create_table_sql .= "`note` varchar(255) COMMENT '备注【驳回缘由】',";
        $create_table_sql .= "`create_time` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',";
        $create_table_sql .= "PRIMARY KEY (`id`),";
        $create_table_sql .= "KEY `" . $am_info['table_name'] . "_pid` (`pid`),";
        $create_table_sql .= "KEY `" . $am_info['table_name'] . "_uid` (`uid`),";
        $create_table_sql .= "KEY `" . $am_info['table_name'] . "_audit_id` (`audit_id`),";
        $create_table_sql .= "CONSTRAINT `" . $am_info['table_name'] . "_pid` FOREIGN KEY (`pid`) REFERENCES `ams_classify_table` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,";
        $create_table_sql .= "CONSTRAINT `" . $am_info['table_name'] . "_uid` FOREIGN KEY (`uid`) REFERENCES `ams_user` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE,";
        $create_table_sql .= "CONSTRAINT `" . $am_info['table_name'] . "_audit_id` FOREIGN KEY (`audit_id`) REFERENCES `ams_user` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE";
        $create_table_sql .= ") ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='";
        $create_table_sql .= "系统自动创建的成果收集表";
        $create_table_sql .= "'";

        try {
            Db::query($create_table_sql);
        } catch (\Throwable $th) {
            return false;
        }
        return true;
    }

    /**
     * 清除收集表的数据
     * @param $cid 分类ID
     * @return 清空状态
     */
    public function classify_table_others_clear(int $cid)
    {
        $am_info = Db::name('classify_table')->where('cid', $cid)->find();
        if (!$am_info) {
            return false;
        }
        try {
            Db::query('truncate table ' . $am_info['table_name']);
            return true;
        } catch (\Throwable $th) {
            return false;
        }
    }

    /**
     * 删除收集表
     * @param $cid 分类ID
     * @return 清空状态
     */
    public function classify_table_others_drop(int $cid)
    {
        $am_info = Db::name('classify_table')->where('cid', $cid)->find();
        if (!$am_info) {
            return false;
        }
        try {
            Db::query('drop table ' . $am_info['table_name']);
            return true;
        } catch (\Throwable $th) {
            return false;
        }
    }

    /**
     * 通过 cid 修改中间表的数据
     */
    public function set_classify_table_data_by_cid(int $cid, array $data)
    {
        try {
            Db::name('classify_table')->where('cid', $cid)->save($data);
        } catch (\Throwable $th) {
            return false;
        }
        return true;
    }

    // 系统创建的表的操作 ======================================================================================
    /**
     * 获取系统创建表的一条数据，用于验证
     * 
     * @param string $table_name 表名
     * @return 是否有数据
     */
    public function get_classify_table_one_data(string $table_name)
    {
        $am_info = Db::table($table_name)->find(1);
        return $am_info;
    }   

    // classify_table_other ===================================================================================================================

    /**
     * 通过表名和用户ID获取数据
     * 
     * @param $table_name 表名
     * @param $uid 用户ID
     * @return 返回指定的数据
     */
    public function get_classify_table_other_info_by_tableName_and_uid(string $table_name,int $uid){
        return Db::table($table_name)->where('uid',$uid)->select();
    }

    /**
     * 通过表名获取数据
     * 
     * @param $table_name 表名
     * @param $uid 用户ID
     * @return 返回指定的数据
     */
    public function get_classify_table_other_info_by_tableName(string $table_name){
        return Db::table($table_name)->select();
    }

    // 成果文件操作 ============================================================================================

}
